#-*- coding: utf-8 -*-
import urllib2
try :
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET
    

#===============================================================================
# TO DO
#===============================================================================
#créer une base pour récupérer les metadata de l'api ( une entrée pour chaque type d'api (wallet, transactions, assets...)
#y stocker current-time, cached-until et ?? autre??

#gestion plus propre des exceptions


#===============================================================================
# Récupère les data de l'api
#===============================================================================
xmlurl = 'https://api.eve-online.com/corp/AssetList.xml.aspx?keyID=2265134&vCode=7BnDrS2Qd4mECu8aUI5HTnfAPVhUnWjQH1RaUHfoOYOQ9tfofv3VDamWcJQCfbeO'
xmlFile = 'c:/wamp/www/eve_api_test/AssetList.xml'

#===============================================================================
# FUNCTIONS
#===============================================================================

#récupère les données de l'api depuis un url
def catchAssetsApi(url):
    #récupère le xml et crée un objet ElementTree xml
    try:
        xml = urllib2.urlopen(url)
        tree = ET.parse(xml)
        root = tree.getroot()
        return root
    except Exception, e:
        print(e)
#récupère les données de l'api depuix un fichier .xml
def catchAssetsApiFile(xmlfile):
    #récupère le xml et crée un objet ElementTree xml
    try:
        tree = ET.parse(xmlfile)
        root = tree.getroot()
        return root
    except Exception, e:
        print(e)

#A MODIF : STOCKAGE DANS TABLE DEDIEE
#retourne les top elements (current time, cachedUntil, et le nb d'élément dans la racine)
def printApiMetadata(root):
    print "nb in root: ", len(root)
    print "Current time: ", root[0].text
    print "CachedUntil: ", root[2].text
    #renvoyer une liste avec ces valeurs
                
#iter dans un noeud d'un ElementTree suivant un path (récupère les noeuds correspondants au path) et 
#retourne un dictionnaire avec pour (key) les noeuds parent et pour (valeurs) la liste des noeuds enfants (ElementTree)
def parse_subrow(node, path):
    childsList = list(node.iterfind(path))
    #childsList = list(node.iterfind("./rowset/row"))
    parent_map = {node.get('itemID') : childsList}
    #print parent_map
    return parent_map

#prend un dictionnaire et explore pour chaque key (parent) les enfants (noeuds) qui correspondent à un path
#iter de boucle en boucle (doit couvrir toutes les possibles x sub-level d'un xml)
def parcours_map(parent_childs_Map, path, rowCount):
    y=0
    rowCount = rowCount
    for cle, valeurs in parent_childs_Map.items():
        print "{} : {} - {}".format(cle,len(valeurs), valeurs)
        for item in valeurs:
            y+=1
            rowCount+=1
            #print item.get('itemID'), " : ", len(list(item.iterfind('./rowset/row'))), " - ", list(item.iterfind('./rowset/row'))
            if len(list(item.iterfind('./rowset/row'))) > 1:
                print "    {0} - {1} : {2} - {3}".format(y, item.get('itemID'), len(list(item.iterfind('./rowset/row'))), list(item.iterfind('./rowset/row')))
                #print item.get('itemID'), " : ", len(list(item.iterfind('./rowset/row'))), " - ", list(item.iterfind('./rowset/row'))
                for subitem in list(item.iterfind('./rowset/row')):
                    rowCount+=1
                    sub_map= parse_subrow(subitem, './rowset/row')#A CORRIGER ICI NB DE PARAMETRES
                    subCount = parcours_map(sub_map, '/rowset/row', rowCount)
                    rowCount = subCount
#                print "{} : has {} child ".format(item.get('itemID'), len(list(item.getiterator('row'))))
            else:
                print "    {} - {} : has no child ".format(y, item.get('itemID'))
        return  rowCount
       
        

# fonction qui parcourt tous les noeuds avec comme tag "sutbag" contenus dans "node" dont les parents sont des noeuds qui ont un attribut "attribute" qui vaut "attributeValue"
#récupère les premiers noeud d'un ElementTree correspondant à un path (ici stations/primary containers)
#node = à root du xml, path = tous les row(tag) qui possèdent l'attribut "locationID"
def parse_row(node, attributeName, tag):
    y=0
    rowCount=0
    control= True
    #ça c'est juste! ça prendra que les premiers noeuds!
    #node.iterfind(".//*[@name='assets']/row") => tous les noeud row qui sont enfants de noeuds ayant comme attribut "name" = "assets" => Ok 1 seul niveau donc ça marche
    
    #A modifier pour prendre les row qui possèdent l'attribut "locationID" (plus simple) => récupère toutes les stations / conteneurs primaires
    try:
        if node is not None:
            #path = ".//{0}[@{1}]".format(tag, attributeName)
            path = ".//row[@{}]".format(attributeName)
            print path
            rows = node.iterfind(path)
#            “.//a[@href]”
#             row = node.iterfind(".//*[@{0}='{1}']/{2}".format(attribute, attributeValue, subtag))
#             rowCount = node.findall(".//*[@{0}='{1}']/{2}".format(attribute, attributeValue, subtag))
            #print rows
            print "Nombre de row : ", len(list(node.findall(path)))
            while control:
                try:
                    #a t on tj besoin de cette condition ( test déjà fait plus haut)
                    if rows is not None:
                        y+=1
                        rowCount += 1
                        print "                    ROW COUNT : ", rowCount 
                    #parcours l'iterateur d'un cran de plus (passe à l'element suivant)
                        element = rows.next()
                        #print element.get('itemID')
                        print y, "-", element.get('itemID')
                        if len(list(element.iter('row'))) > 1:
                            parent_map = parse_subrow(element, './rowset/row')
                            #print "Map : ", parent_map
                            subCount = parcours_map(parent_map, './rowset/row', rowCount)
                            print "                            SUB COUNT : ",subCount
                            rowCount = subCount
                            print "                ROW COUNT 2 : ", rowCount 
                    else:
                        print y, " - Element : ", element.get('itemID'), "=> save()"
                 
                        #parentMap = parse_subrow2(element, "row", y)
                        #parse_subrow(element, "name", "contents", "row", y)
                except StopIteration:
                    control = False
            print " Row count check : ", rowCount
            
    except Exception , e:
        print (e), 

#===============================================================================
# PROGRAMM START
#===============================================================================
root = catchAssetsApiFile(xmlFile)
#first_containers_path = ".//*[@name=]"
second_path = ""
print root
print "Nb de rows dans root :" ,len(root.findall(".//*row"))

parse_row(root, "locationID", "row")



        
          

    
